/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.comandos.admin;

import br.ufc.quixada.adrs.interfaces.Comando;
import br.ufc.quixada.adrs.model.FaixaEtaria;
import br.ufc.quixada.adrs.model.Produtor;
import br.ufc.quixada.adrs.model.Rebanho;
import br.ufc.quixada.adrs.model.RelatorioResult2;
import br.ufc.quixada.adrs.model.TipoAnimal;
import br.ufc.quixada.adrs.model.Visita;
import br.ufc.quixada.adrs.service.TipoAnimalService;
import br.ufc.quixada.adrs.util.UtilAdrs;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author ismaily
 */
public class CmdMontarRelatorioQtRebanho implements Comando {

    public String executa(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession(true);



        //Definição das mensagens de erro que podem ocorrer
        String[] mensagemErro = new String[7];
        mensagemErro[1] = "Por favor, selecione um ou todos os tipos de animais";
        mensagemErro[2] = "Por favor, especifique um período para o relatório";
        mensagemErro[3] = "Por favor, verifique o preenchemento da data que indica o início do período do relatório.";
        mensagemErro[4] = "Por favor, verifique o preenchemento da data que indica o fim do período do relatório.";
        mensagemErro[5] = "Por favor, selecione um ou alguns filtros para o relatório";
        mensagemErro[6] = "Período selecionado não contem visitas";


        //recuperar dados do formulário
        String todosPeriodos = request.getParameter("todosPeriodos");
        Date ini = null;
        String dataIni = request.getParameter("dataInicio");
        if (dataIni != null) {
            ini = UtilAdrs.treatToDate(dataIni);
        }
        Date fim = null;
        String dataFim = request.getParameter("dataFim");
        if (dataFim != null) {
            fim = UtilAdrs.treatToDate(dataFim);
        }
        String tipoAnimal = (String) request.getParameter("tipoAnimal");
        String machos = request.getParameter("machos");


        //se a opções machos foi marcado, coloco machos= M, porque é assim  que é salvo no banco
        if (machos != null) {
            machos = "M";

        }
        String femeas = request.getParameter("femeas");

        //se a opções fêmeas foi marcado, coloco femeas= F, porque é assim  que é salvo no banco
        if (femeas != null) {
            femeas = "F";

        }

        //capturar filtros para o relatório
        String totalRebanho = request.getParameter("totalRebanho");
        String faixa0To6 = request.getParameter("faixa0To6");
        String faixa6To12 = request.getParameter("faixa6To12");
        String faixa12To2000 = request.getParameter("faixa12To2000");
        String cruzarDados = request.getParameter("cruzarDados");
        String exibirRelatorioDetalhadoReb = request.getParameter("detalharRelatorioRebanho");



        //protutores marcados
        ArrayList<Produtor> prods = (ArrayList<Produtor>) session.getAttribute("produtoresSelecionados");

        //Estrutura criada para organizar a estrutura do relatório, para mais detalhes, ver classe RelatarioRebanhoResult
        ArrayList<RelatorioResult2> result = new ArrayList<RelatorioResult2>();

        //se o Admin marcar cruzar dados colocamos true na variável cruzar
        boolean cruzar = false;
        if (cruzarDados != null) {
            cruzar = true;
        }

        //vairável que indica se os dois tipo de sexos foram marcados
        boolean todosSexos = false;

        if (machos != null && femeas != null) {
            todosSexos = true;
        }

        //validar se os campos foram todos preenchidos devidademente
        int codErro = validaCampos(tipoAnimal, todosPeriodos, dataIni, dataFim, machos, femeas, totalRebanho, faixa0To6, faixa6To12, faixa12To2000);
        if (codErro != 1) {
            session.setAttribute("erro", mensagemErro[codErro * (-1)]); //caso algum erro ocorra retorna para a tela com uma mensgem de erro
            return "/admin/admin_monta_relatorio_qt_passo_quatro.jsp";
        }


        TipoAnimal tAnimal = null;
        //booleano que indica se a opções todos os tipos foi marcado
        boolean todosOstiposAnimais = true;
        //capturar o tipo de animal marcado
        if (!tipoAnimal.equalsIgnoreCase("todos")) {
            todosOstiposAnimais = false;
            Long idTipo = Long.parseLong(tipoAnimal);
            tAnimal = new TipoAnimalService().getTipoAnimalById(idTipo);
            tipoAnimal = tAnimal.getTipo();
        }


        //se não foi marcado a opção todos os periódos e no periódo marcado não há questionário quantitativo, o método retorna uma mensagem de erro
        if (todosPeriodos == null || todosPeriodos.trim().isEmpty()) {
            if (!validaData(ini, fim, prods)) {
                session.setAttribute("erro", mensagemErro[6]);
                return "/admin/admin_monta_relatorio_qt_passo_quatro.jsp";
            }
        }


        //estrutura onde será guardado os fitros de cada produtor, cada produtor tem um array de filtros e dados
        RelatorioResult2 r = null;
        List<Visita> visitas;
        for (Produtor p : prods) {
            //para cada produtor uma nova estrutura
            r = new RelatorioResult2();
            r.setPrudutor(p);
            visitas = p.getVisitas();

            Visita ultima = p.getUltimaVisitaComQuantitativo();
            if (todosPeriodos == null) {
                ultima = p.getUltimaVisitaComQuantitativo(ini, fim);
            }
            for (Visita v : visitas) {
                Date visi = v.getData();
                if ((todosPeriodos != null) || ((visi.before(fim) || visi.equals(fim)) && (visi.equals(ini) || visi.after(ini)))) {
                    if (v.getQuestionarioQuantitativo() == null) {
                        continue;
                    }
                    if (machos != null) {
                        if (v.getId().equals(ultima.getId())) {
                            getMachos(v, tAnimal, todosOstiposAnimais, r, true);
                        } else {
                            getMachos(v, tAnimal, todosOstiposAnimais, r, false);
                        }
                    }
                    if (femeas != null) {
                        if (v.getId().equals(ultima.getId())) {
                            getFemeas(v, tAnimal, todosOstiposAnimais, r, true);
                        } else {
                            getFemeas(v, tAnimal, todosOstiposAnimais, r, false);
                        }
                    }
                    if (totalRebanho != null) {
                        if (v.getId().equals(ultima.getId())) {
                            getRebanho(v, tAnimal, todosOstiposAnimais, r, true);
                        } else {
                            getRebanho(v, tAnimal, todosOstiposAnimais, r, false);
                        }
                    }
                    if (faixa0To6 != null) {
                        if (machos != null) {
                            if (v.getId().equals(ultima.getId())) {
                                getFaixa0to6(v, tAnimal, todosOstiposAnimais, r, cruzar, machos, todosSexos, true);
                            } else {
                                getFaixa0to6(v, tAnimal, todosOstiposAnimais, r, cruzar, machos, todosSexos, false);
                            }
                        } else if (femeas != null) {
                            if (v.getId().equals(ultima.getId())) {
                                getFaixa0to6(v, tAnimal, todosOstiposAnimais, r, cruzar, femeas, todosSexos, true);
                            } else {
                                getFaixa0to6(v, tAnimal, todosOstiposAnimais, r, cruzar, femeas, todosSexos, false);
                            }
                        }

                    }
                    if (faixa6To12 != null) {
                        if (machos != null) {
                            if (v.getId().equals(ultima.getId())) {
                                getFaixa6to12(v, tAnimal, todosOstiposAnimais, r, cruzar, machos, todosSexos, true);
                            } else {
                                getFaixa6to12(v, tAnimal, todosOstiposAnimais, r, cruzar, machos, todosSexos, false);
                            }
                        } else if (femeas != null) {
                            if (v.getId().equals(ultima.getId())) {
                                getFaixa6to12(v, tAnimal, todosOstiposAnimais, r, cruzar, machos, todosSexos, true);
                            } else {
                                getFaixa6to12(v, tAnimal, todosOstiposAnimais, r, cruzar, femeas, todosSexos, false);
                            }
                        }
                    }
                    if (faixa12To2000 != null) {
                        if (machos != null) {
                            if (v.getId().equals(ultima.getId())) {
                                getFaixa12to20000(v, tAnimal, todosOstiposAnimais, r, cruzar, machos, todosSexos, true);
                            } else {
                                getFaixa12to20000(v, tAnimal, todosOstiposAnimais, r, cruzar, machos, todosSexos, false);
                            }
                        } else if (femeas != null) {
                            if (v.getId().equals(ultima.getId())) {
                                getFaixa12to20000(v, tAnimal, todosOstiposAnimais, r, cruzar, femeas, todosSexos, true);
                            } else {
                                getFaixa12to20000(v, tAnimal, todosOstiposAnimais, r, cruzar, femeas, todosSexos, false);
                            }
                        }
                    }

                }
            }
            r.ordenarValoresFiltros();
            result.add(r);
        }



        //Exibir qual periodo foi marcado
        String periodo = "de " + getPrimeiraDataQuestionario(prods) + " a " + getUltimaDataQuestionario(prods);
        if (todosPeriodos == null) {
            periodo = "de " + dataIni + " a " + dataFim;
        }


        //ordenar resultados gerais que será exibido na tela        
        List<String> filtros = result.get(0).getFiltrosMarcados();
        List<Integer> dados = this.getTotalDados(result);




        //setar valores para compor o gráfico
        session.setAttribute("title", "Gráfico");
        session.setAttribute("eixoX", "Filtros");
        session.setAttribute("eixoY", "Valores");

        //setar valores na sessão
        session.setAttribute("periodo", periodo);
        session.setAttribute("relatorioResult", result);
        session.setAttribute("tipoAnimal", tipoAnimal);
        session.setAttribute("somaTotal", dados);
        session.setAttribute("filtros", filtros);
        session.setAttribute("datalharRebanho", exibirRelatorioDetalhadoReb);
        return "/admin/relatorio_qt_gerado.jsp";
    }

    private int validaCampos(String tipoAnimal, String tdPeriodos, String dataIni, String dataFim, String machos, String femeas, String rebanho, String faixa0to6, String faixa6to12, String faixa12To2000) {

        if (tipoAnimal == null || tipoAnimal.trim().isEmpty()) {
            return -1;
        }
        if (tdPeriodos == null && ((dataFim == null || dataFim.trim().isEmpty()) || (dataIni == null || dataIni.trim().isEmpty()))) {
            return -2;
        }
        if (tdPeriodos == null && !UtilAdrs.validaData(dataIni)) {
            return -3;
        }
        if (tdPeriodos == null && !UtilAdrs.validaData(dataFim)) {
            return -4;
        }
        if (machos == null && femeas == null && rebanho == null && faixa0to6 == null && faixa6to12 == null && faixa12To2000 == null) {
            return -5;
        }
        return 1;
    }

    private boolean validaData(Date ini, Date fim, ArrayList<Produtor> prods) {

        if (ini == null || fim == null) {
            return false;
        }
        if (ini.after(fim)) {
            return false;
        }
        for (Produtor p : prods) {
            List<Visita> visitas = p.getVisitas();
            for (Visita a : visitas) {
                if (a.getQuestionarioQuantitativo() == null) {
                    continue;
                }
                Date visi = a.getData();
                if ((visi.before(fim) || visi.equals(fim)) && (visi.after(ini) || visi.equals(ini))) {
                    return true;
                }
            }
        }
        return false;
    }

    private void getRebanho(Visita visita, TipoAnimal tipo, boolean todosOsTipos, RelatorioResult2 result, boolean ultimaVisita) {

        //se não há um questionário a função aborta
        if (visita.getQuestionarioQuantitativo() == null) {
            return;
        }
        // pegamos todos os rebanhos desse questionário
        List<Rebanho> rebanhos = visita.getQuestionarioQuantitativo().getRebanhos();
        int rebanho = 0; // variável onde será guardado o total do rebanho

        for (Rebanho r : rebanhos) {
            //entra no if se o Admin tiver marcado todos os tipos de animais ou se o tipo do rebanho corresponder ao marcado pelo Admin
            if (todosOsTipos || r.getTipoAnimal().getId().equals(tipo.getId())) {
                rebanho += r.getQuantidade();
            }
        }
        //Adiciono o nome da mensagem que irá ser exibidada na tela de relatório
        String filtro = "Total do Rebanho";
        // Adiciono o fitro acima e seu dado correspondente
        result.setFiltroDado(filtro, rebanho, visita.getData());

        //se essa for a última visita com qt, adicionamos para compor a solução geral
        if (ultimaVisita) {
            result.setFiltroDadoSubTotal(filtro, rebanho);
        }

    }

    /*Não há cruzamento quando se busca por macho ou fêmea, deixaremos para cruzar os dados, quando houver busca por faixa etária
     * porque será mais fácil cruzar os dados com os sexo, por exemplo:
     * O admin seleciona machos e faixa 0--6, haverá duas chamadas de método, o método getMachos que só retorna o número de machos no
     * do rebanho do produtor no tempo especificado. na chamada do método faixa 0--6, aí sim haverá cruzamentos dos dados, lógico que só se
     * o Admin marcar o checkbox cruzar dados
     */
    private void getMachos(Visita visita, TipoAnimal tipo, boolean todosOsTipos, RelatorioResult2 result, boolean ultimaVisita) {

        // pegamos todos os rebanhos desse questionário
        List<Rebanho> rebanhos = visita.getQuestionarioQuantitativo().getRebanhos();
        int machos = 0; // variável onde será guardado o total de machos

        for (Rebanho r : rebanhos) {
            //entra no if se o Admin tiver marcado todos os tipos de animais ou se o tipo do rebanho corresponder ao marcado pelo Admin
            if (todosOsTipos || r.getTipoAnimal().getId().equals(tipo.getId())) {
                if (r.getSexo().equalsIgnoreCase("M")) {
                    machos += r.getQuantidade();
                }
            }
        }
        //Adiciono o nome da mensagem que irá ser exibidada na tela de relatório
        String filtro = "Total de Machos";
        // Adiciono o fitro acima e seu dado correspondente
        result.setFiltroDado(filtro, machos, visita.getData());

        //se essa for a última visita com qt, adicionamos para compor a solução geral
        if (ultimaVisita) {
            result.setFiltroDadoSubTotal(filtro, machos);
        }
    }

    private void getFemeas(Visita visita, TipoAnimal tipo, boolean todosOsTipos, RelatorioResult2 result, boolean ultimaVisita) {
        // pegamos todos os rebanhos desse questionário
        List<Rebanho> rebanhos = visita.getQuestionarioQuantitativo().getRebanhos();
        int femeas = 0; // variável onde será guardado o total de femeas

        for (Rebanho r : rebanhos) {
            //entra no if se o Admin tiver marcado todos os tipos de animais ou se o tipo do rebanho corresponder ao marcado pelo Admin
            if (todosOsTipos || r.getTipoAnimal().getId().equals(tipo.getId())) {
                // Agora aqui sim, só quero as fêmeas :), poderia colocar um só método para obeter machos e femeas,
                //para isso bastaria acrescentar um parametro sexo, porém iria ficar muito grande, preferi dividir em dois
                if (r.getSexo().equalsIgnoreCase("F")) {
                    femeas += r.getQuantidade();
                }
            }

        }
        //Adiciono o nome da mensagem que irá ser exibidada na tela de relatório
        String filtro = "Total de Fêmeas";
        // Adiciono o fitro acima e seu dado correspondente
        result.setFiltroDado(filtro, femeas, visita.getData());

        //se essa for a última visita com qt, adicionamos para compor a solução geral
        if (ultimaVisita) {
            result.setFiltroDadoSubTotal(filtro, femeas);
        }
    }

    private void getFaixa6to12(Visita visita, TipoAnimal tipo, boolean todosOsTipos, RelatorioResult2 result, boolean cruzarDados, String sexo, boolean todosSexos, boolean ultimaVisita) {

        // pegamos todos os rebanhos desse questionário
        List<Rebanho> rebanhos = visita.getQuestionarioQuantitativo().getRebanhos();

        int faixa6to12 = 0; // variável onde será guardado o total de animais na faixa de 6 -12
        int faixa6t012Cruzados = 0; //variável onde será guardado o valor dos dados do animais cruzados com os os sexos dos mesmos        
        for (Rebanho r : rebanhos) {
            //entra no if se o Admin tiver marcado todos os tipos de animais ou se o tipo do rebanho corresponder ao marcado pelo Admin
            if (todosOsTipos || r.getTipoAnimal().getId().equals(tipo.getId())) {

                //como a faixa de 6-12 tem o id 2
                if (r.getFaixaEtaria().getId().equals(FaixaEtaria.FAIXA_ETARIA_6_A_12)) {
                    // se o Admin escolher cruzar os dados cruzamos com o sexo mandado
                    if (cruzarDados && !todosSexos) {
                        if (r.getSexo().equalsIgnoreCase(sexo)) {
                            faixa6t012Cruzados += r.getQuantidade();
                        }
                    }
                    faixa6to12 += r.getQuantidade();
                }
            }
        }
        //Adiciono o nome da mensagem que irá ser exibidada na tela de relatório
        String filtro = "Total animais na faixa [6-12] meses";
        // Adiciono o fitro acima e seu dado correspondente
        result.setFiltroDado(filtro, faixa6to12, visita.getData());

        //se essa for a última visita com qt, adicionamos para compor a solução geral
        if (ultimaVisita) {
            result.setFiltroDadoSubTotal(filtro, faixa6to12);
        }

        //se o Admin escolhei cruzar os dados, adiciono mais um filtro e mais um dado
        if (cruzarDados && !todosSexos) {
            String sex = "Fêmeas"; //Fêmeas por default, gosto de Fêmeas :)
            if (sexo.equals("M")) {
                sex = "Machos";
            }
            String filtroDadosCruzados = "Total de " + sex + " na faixa etária [6-12] meses";
            //adiciono mais um filtro e um dado
            result.setFiltroDado(filtroDadosCruzados, faixa6t012Cruzados, visita.getData());
            //se essa for a última visita com qt, adicionamos para compor a solução geral
            if (ultimaVisita) {
                result.setFiltroDadoSubTotal(filtroDadosCruzados, faixa6t012Cruzados);
            }
        }
    }

    private void getFaixa0to6(Visita visita, TipoAnimal tipo, boolean todosOsTipos, RelatorioResult2 result, boolean cruzarDados, String sexo, boolean todosSexos, boolean ultimaVisita) {

        // pegamos todos os rebanhos desse questionário
        List<Rebanho> rebanhos = visita.getQuestionarioQuantitativo().getRebanhos();
        int faixa0to6 = 0; // variável onde será guardado o total de animais na faixa de 0...6
        int faixa0to6Cruzado = 0; //variável onde será guardado o valor dos dados do animais cruzados com os os sexos dos mesmos

        for (Rebanho r : rebanhos) {
            //entra no if se o Admin tiver marcado todos os tipos de animais ou se o tipo do rebanho corresponder ao marcado pelo Admin
            if (todosOsTipos || r.getTipoAnimal().getId().equals(tipo.getId())) {
                //como a faixa etária 0-6 meses tem id 1
                if (r.getFaixaEtaria().getId().equals(FaixaEtaria.FAIXA_ETARIA_0_A_6)) {
                    //se o Admin escolher cruzar dados cruzamos com o sexo passado
                    if (cruzarDados && !todosSexos) {
                        if (r.getSexo().equalsIgnoreCase(sexo)) {
                            faixa0to6Cruzado += r.getQuantidade();
                        }
                    }
                    faixa0to6 += r.getQuantidade();
                }
            }
        }
        //Adiciono o nome da mensagem que irá ser exibidada na tela de relatório
        String filtro = "Total de animais na faixa [0-6] meses";
        // Adiciono o fitro acima e seu dado correspondente
        result.setFiltroDado(filtro, faixa0to6, visita.getData());
        //se essa for a última visita com qt, adicionamos para compor a solução geral
        if (ultimaVisita) {
            result.setFiltroDadoSubTotal(filtro, faixa0to6);
        }
        //se o Admin escolhei cruzar os dados, adiciono mais um filtro e mais um dado
        if (cruzarDados && !todosSexos) {
            String sex = "Fêmeas"; //Fêmeas por default, gosto de Fêmeas :)
            if (sexo.equals("M")) {
                sex = "Machos";
            }
            String filtroDadosCruzados = "Total de " + sex + " na faixa etária [0--6] meses";
            //adiciono mais um filtro e um dado
            result.setFiltroDado(filtroDadosCruzados, faixa0to6Cruzado, visita.getData());
            //se essa for a última visita com qt, adicionamos para compor a solução geral
            if (ultimaVisita) {
                result.setFiltroDadoSubTotal(filtroDadosCruzados, faixa0to6Cruzado);
            }
        }
    }

    private void getFaixa12to20000(Visita visita, TipoAnimal tipo, boolean todosOsTipos, RelatorioResult2 result, boolean cruzarDados, String sexo, boolean todosSexos, boolean ultimaVisita) {

        // pegamos todos os rebanhos desse questionário
        List<Rebanho> rebanhos = visita.getQuestionarioQuantitativo().getRebanhos();
        int faixa12to20000 = 0; // variável onde será guardado o total de animais na faixa de 0...6
        int faixa12to20000Cruzar = 0; //variável onde será guardado o valor dos dados do animais cruzados com os os sexos dos mesmos

        for (Rebanho r : rebanhos) {
            //entra no if se o Admin tiver marcado todos os tipos de animais ou se o tipo do rebanho corresponder ao marcado pelo Admin
            if (todosOsTipos || r.getTipoAnimal().getId().equals(tipo.getId())) {
                //como a faixa etária 12-... meses tem id 3
                if (r.getFaixaEtaria().getId().equals(FaixaEtaria.FAIXA_ETARIA_12_A_INF)) {
                    //se o Admin escolher cruzar dados cruzamos com o sexo passado
                    if (cruzarDados && !todosSexos) {
                        if (r.getSexo().equalsIgnoreCase(sexo)) {
                            faixa12to20000Cruzar += r.getQuantidade();
                        }
                    }
                    faixa12to20000 += r.getQuantidade();
                }
            }
        }
        //Adiciono o nome da mensagem que irá ser exibidada na tela de relatório
        String filtro = "Total de animais na faixa [12-...] meses";
        // Adiciono o fitro acima e seu dado correspondente
        result.setFiltroDado(filtro, faixa12to20000, visita.getData());
        //se essa for a última visita com qt, adicionamos para compor a solução geral
        if (ultimaVisita) {
            result.setFiltroDadoSubTotal(filtro, faixa12to20000);
        }
        //se o Admin escolhei cruzar os dados, adiciono mais um filtro e mais um dado
        if (cruzarDados && !todosSexos) {
            String sex = "Fêmeas"; //Fêmeas por default, gosto de Fêmeas :)
            if (sexo.equals("M")) {
                sex = "Machos";
            }
            String filtroDadosCruzados = "Total de " + sex + " na faixa etária [12-...] meses";
            //adiciono mais um filtro e um dado
            result.setFiltroDado(filtroDadosCruzados, faixa12to20000Cruzar, visita.getData());
            //se essa for a última visita com qt, adicionamos para compor a solução geral
            if (ultimaVisita) {
                result.setFiltroDadoSubTotal(filtroDadosCruzados, faixa12to20000Cruzar);
            }
        }
    }

    /*
     * Método que retorna a data da primeira visita, caso o Admin selecione a opções todos os periodos
     */
    public String getPrimeiraDataQuestionario(ArrayList<Produtor> produtores) {

        Date primeira = new Date();
        List<Visita> visitas;
        for (Produtor p : produtores) {
            visitas = p.getVisitas();
            if (visitas == null) {
                continue;
            }
            for (Visita v : visitas) {
                if (!v.hasQuestionarioQuantitativo()) {
                    continue;
                }
                Date dAux = v.getData();
                if (primeira.after(dAux)) {
                    primeira = dAux;
                }

            }
        }
        return UtilAdrs.treatToString(primeira);
    }

    /*
     * Método que retorna a data da ultima visita, caso o Admin selecione a opções todos os periodos
     */
    public String getUltimaDataQuestionario(ArrayList<Produtor> produtores) {

        Date ultima = null;
        List<Visita> visitas;
        for (Produtor p : produtores) {
            visitas = p.getVisitas();
            if (visitas == null) {
                continue;
            }
            for (Visita v : visitas) {
                if (!v.hasQuestionarioQuantitativo()) {
                    continue;
                }
                Date dAux = v.getData();
                if (ultima == null || ultima.before(dAux)) {
                    ultima = dAux;
                }
            }
        }
        return UtilAdrs.treatToString(ultima);
    }

    /* Obter a soma total do relatório levando em conta todos os produtores, por exemplo:
     * se for marcado machos, cada produtor tem um total de machos, esse método soma esses valores, para obter
     * o valor de todos os machos dos produtores selecionados
     */
    public List<Integer> getTotalDados(ArrayList<RelatorioResult2> result) {

        List<Integer> valores = new ArrayList<Integer>();
        for (int i = 0; i < this.getTamanhoRelatorioGeral(result); i++) {
            int cont = 0;
            for (RelatorioResult2 r : result) {
                cont += r.getSubtotal(i);
            }
            valores.add(i, cont);
        }
        for (RelatorioResult2 r : result) {
            List<Date> datas = r.getDatas();
            for (Date d : datas) {
                r.ordenaFiltroByData(d);
            }
        }
        return valores;
    }

    int getTamanhoRelatorioGeral(ArrayList<RelatorioResult2> result) {

        for (RelatorioResult2 r : result) {
            if (r.getFiltrosMarcados() != null && r.getSubTotal().size() > 0) {
                return r.getSubTotal().size();
            }
        }
        return 0;
    }
}
